package com.gskj.eduservice.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.gskj.eduservice.entity.EduSubject;
import com.gskj.eduservice.entity.excel.ExcelSubjectData;
import com.gskj.eduservice.service.IEduSubjectService;
import com.gskj.servicebase.exceptionhandler.GuLiException;

/**
 * @author :CodingFarmer_码农  Connor(康纳)_郭
 * @date : 10:09 20.5.16
 * @Company : http://www.gskj.com
 * @Version : 1.0
 * <p>
 * 读取 excel 监听器
 */
public class SubjectExcelListener extends AnalysisEventListener<ExcelSubjectData> {

    // excel 监听器 不能交给 spring管理。所以不能直接使用@Autowired,
    // 通过 有参构造，将 IEduSubjectService 传给当前 成员变量 IEduSubjectService
    // 使用 调用 mapper进行数据库保存

    private IEduSubjectService iEduSubjectService;

    public SubjectExcelListener() {
    }

    public SubjectExcelListener(IEduSubjectService iEduSubjectService) {
        this.iEduSubjectService = iEduSubjectService;
    }

    // 一行一行读
    @Override
    public void invoke(ExcelSubjectData excelSubjectData, AnalysisContext analysisContext) {
        // 判断 excel中读取的内容 是否为空
        if (excelSubjectData == null) {
            throw new GuLiException(20001, "excel中没有可读取的内容");
        }

        // 一行一行读取，每次读取两个值， 值1 为以一级分类。值2 为二级分类

        // 获取当前读取的 一级分类名称
        String firstSubjectName = excelSubjectData.getFirstSubjectName();

        //判断当前读取的一级分类是否已存在 数据表
        EduSubject firstSubject = existFirstSubject(iEduSubjectService, firstSubjectName);

        if (firstSubject == null) {
            // 说明 数据表中没有，直接添加
            firstSubject = new EduSubject();
            firstSubject.setParentId("0");
            firstSubject.setTitle(firstSubjectName);
            // 保存
            iEduSubjectService.save(firstSubject);
        }

        // 获取当前二级分类对应的 行中的 一级分类id
        String pid = firstSubject.getId();

        //判断当前读取的二级分类名称是否存在数据表
        String sconedSubjectName = excelSubjectData.getSconedSubjectName();

        // 通过 父id ，title判断
        EduSubject secondSubject = existSecondSubject(iEduSubjectService, sconedSubjectName, pid);
        // 为空直接添加
        if (secondSubject == null) {
            secondSubject = new EduSubject();
            secondSubject.setParentId(pid);
            secondSubject.setTitle(sconedSubjectName);
            // 保存
            iEduSubjectService.save(secondSubject);
        }
    }

    /**
     * 判断 一级分类 是否有重复
     *
     * @param service
     * @param name    分类名称
     * @return EduSubject
     */
    private EduSubject existFirstSubject(IEduSubjectService service, String name) {
        // 拼接 查询条件
        QueryWrapper<EduSubject> wrapper = new QueryWrapper<>();

        wrapper.eq("title", name); // 根据 title 分类名称
        wrapper.eq("parent_id", "0"); // 必须是 一级分类
        return service.getOne(wrapper);
    }

    /**
     * 判断 二级分类 是否有重复
     *
     * @param service
     * @param name    分类名称
     * @param pid     父ID
     * @return EduSubject
     */
    private EduSubject existSecondSubject(IEduSubjectService service, String name, String pid) {
        // 拼接 查询条件
        QueryWrapper<EduSubject> wrapper = new QueryWrapper<>();

        wrapper.eq("title", name); // 根据 title 分类名称
        wrapper.eq("parent_id", pid); // 必须是 二级分类，即 parent_id 不为 0
        return service.getOne(wrapper);
    }

    // 读取完成的调用方法
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}
